/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2021-2025. All rights reserved.
 *
 */

import { CoreModuleModelImpl } from '../model/module/core-module-model-impl.js';
import { ProjectModel } from '../model/project/project-model.js';
import { LegacyTargetSourceSetModel, TargetSourceSetModel } from '../model/source-set/source-set-model.js';
import { ApiType } from '../project/data/hap-extra-info.js';
import { ModuleTaskService } from '../tasks/service/module-task-service.js';
import { ModuleJson } from "../options/configure/module-json-options.js";
import ModuleOptObj = ModuleJson.ModuleOptObj;
import { AbilityTypeEnum } from "../enum/ability-type-enum.js";

/**
 * 资源编译相关的工具类
 *
 * @since 2022/09/22
 */
export class CompileResourcesUtil {
  /**
   * 根据资源序号获得resource的编译中间目录名称
   *
   * @param {string} compileResourceType 编译资源类型
   * @param {number} seq 资源序号
   */
  static getCompileTargetFolderBySeq(compileResourceType: string, seq: number): string {
    return `${compileResourceType}${seq === 0 ? '' : seq}`;
  }

  /**
   *  Restool资源编译-m参数，模块名集合
   *  （提取公共方法，保留原有逻辑、拼接顺序）
   *
   * @param {ModuleTaskService} service
   * @param {targetName} targetName
   * @return {string[]} 模块名数组对象
   */
  static getRestoolModuleNames(service: ModuleTaskService, targetName: string): string[] {
    const moduleModel: CoreModuleModelImpl = service.getModuleModel();
    const projectModel: ProjectModel = service.getProjectModel();

    const moduleNames = [moduleModel.getModule().getName()];

    if (moduleModel.getApiType() === ApiType.FA) {
      moduleNames.push(
        (moduleModel.getSourceSetByTargetName(targetName) as LegacyTargetSourceSetModel).getLegacyModuleTargetRes().getConfigJsonOpt()?.module.distro
          .moduleName,
      );
    } else {
      moduleNames.push((moduleModel.getSourceSetByTargetName(targetName) as TargetSourceSetModel).getModuleTargetRes().getModuleJsonOpt()?.module.name);
    }

    return [...new Set(moduleNames.concat(...projectModel.getProject().getSubModules().keys()))];
  }
}

/**
 * 资源编译构造命令类别
 */
export enum CompileResourceBuildCommandType {
  FILE = 'file', // 以文件的方式构建命令
  COMMAND = 'command', // 以命令的方式构建命令
}

/**
 * 获取卡片配置文件名称
 * @param moduleJsonObj
 */
export function getFormConfigName(moduleJsonObj: ModuleOptObj): string | undefined {
  let formConfigName;
  moduleJsonObj?.module?.extensionAbilities?.forEach((extensionAbility) => {
    if (extensionAbility.type === AbilityTypeEnum.FORM &&
      extensionAbility.metadata?.length &&
      extensionAbility.metadata[0].resource) {
      formConfigName = parseProfileJson(extensionAbility.metadata[0].resource!);
    }
  });
  return formConfigName;
}

/**
 * 解析profile配置文件名称
 * @param value
 */
export function parseProfileJson(value: string): string {
  return `${value.replace(/\$profile:/, '')}.json`;
}
